﻿#include<iostream>
/*
运算符重载
1、当运算符用于类类型的对象时，C++规定类类型的运算必须调用相应的运算符重载，否则会报错
2、运算符重载是具有特殊名字的函数，它的名字是由operater后面要重载的运算符组成，和其他函数一样，它也具有返回值和参数列表及函数体
3、重载运算符的参数和运算符作用的运算对象一样多
4、如果一个重载运算符函数属于某类的成员函数，那么他的第一个参数是该类对象的this指针，因此重载运算符函数做成员函数要少一个参数
5、如果运算符重载以后，其优先性和结合性与内置类型的运算符一致
6、不能通过链接语法中没有的语法符号来创建新的运算重载
7、.*、::、sizeof、?:、.、 五个运算符号不能重载
8、重载操作符至少有一个类类型，不能通过修该内置类型的运算法则，如把加法法则改成减法法则
9、⼀个类需要重载哪些运算符，是看哪些运算符重载后有意义，⽐如Date类重载operator-就有意
义，但是重载operator+就没有意义。
10、重载++运算符时，有前置++和后置++，运算符重载函数名都是operator++，⽆法很好的区分。
C++规定，后置++重载时，增加⼀个int形参，跟前置++构成函数重载，⽅便区分。
11、重载<<和>>时，需要重载为全局函数，因为重载为成员函数，this指针默认抢占了第⼀个形参位
置，第⼀个形参位置是左侧运算对象，调⽤时就变成了 对象<<cout，不符合使⽤习惯和可读性。
重载为全局函数把ostream/istream放到第⼀个形参位置就可以了，第⼆个形参位置当类类型对
象。
*/
//eg:
using namespace std;
class Data {
public:
	Data(int year = 2024, int month = 9, int day = 10) {
		_year = year;
		_month = month;
		_day = day;
	}
	int _year;
	int _month;
	int _day;
};
bool operator>(const Data& d1, const Data& d2) {
	if (d1._year > d2._year) {
		return true;
	}
	if (d1._year == d2._year && d1._month > d2._month) {
		return true;
	}
	if (d1._year == d2._year && d1._month == d2._month && d1._day > d2._day) {
		return true;
	}
	return false;
}
void test01() {
	Data d(2024, 9, 10);
	Data d0;
	bool ret1 = d > d0;//编译器会转换为 operator>(d,d0);
	cout << ret1 << endl;
}//通过对运算符重载，使得自定义类型也可以正常比大小
//但现在的问题是使用了类中的成员变量，使其只能公有，下面将重载运算符函数做成员函数
class Data1 {
public:
	Data1(int year = 2024, int month = 9, int day = 10) {
		_year = year;
		_month = month;
		_day = day;
	}
	bool operator>(const Data1& d) {
		if (_year > d._year) {
			return true;
		}
		if (_year == d._year && _month > d._month) {
			return true;
		}
		if (_year == d._year && _month == d._month && _day > d._day) {
			return true;
		}
		return false;
	}//可以看到这时的参数只有一个
	Data& operator++() {
		/*
		*this++;
		return *this;
		*/
	}
	Data operator++(int) {
		/*
		Data tmp=*this++;
		return tmp;
		*/
	}//前置++和后置++的运用
private:
	int _year;
	int _month;
	int _day;
};
void test02() {
	Data1 dad(2024,10,4);
	Data1 mom;
	bool ret22 = dad.operator>(mom);
	bool ret2 = dad > mom;//编译器会转换为 dad.operator(mom);
	cout << ret2 << ' ' << ret22 << endl;
}

int main() {
	test01();
	test02();
	return 0;
}